package com.zhang.common.redis;

import com.zhang.common.util.JsonUtil;
import redis.clients.jedis.Jedis;

import java.util.*;

/**
 * 使用Jedis方法操作Redis
 * @author zhangxin
 * @date 2021/5/28
 */
public class RedisUtil {

    public static boolean HAS_REDIS = true;;

    public RedisUtil() {
    }

    /**
     * 插入，过期时间date，如果value为空，就删除
     *
     */
    public static void setStringAt(String key, String value, Date date) {
        if (HAS_REDIS && key != null && key.trim().length() != 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis != null) {
                try {
                    if (value == null) {
                        jedis.del(key);
                    } else {
                        jedis.set(key, value);
                        if (date != null) {
                            jedis.pexpireAt(key, date.getTime());
                        }
                    }
                } catch (Exception var8) {
                    var8.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }
            }
        }

    }

    /**
     * Lrange 返回列表中指定区间内的元素，区间以偏移量 START 和 END 指定。
     * 其中 0 表示列表的第一个元素， 1 表示列表的第二个元素，以此类推。 你也可以使用负数下标，
     * 以 -1 表示列表的最后一个元素， -2 表示列表的倒数第二个元素，以此类推。
     * @param key,start,end
     * @return java.util.List<java.lang.String>
     */
    public static List<String> lrange(String key, long start, long end) {
        if (!HAS_REDIS) {
            return null;
        } else if (key == null) {
            return null;
        } else {
            List<String> lst = null;
            Jedis jedis = null;

            List var7;
            try {
                jedis =RedisPool.getJedis();
                if (jedis != null) {
                    lst = jedis.lrange(key, start, end);
                    return lst != null && lst.size() != 0 ? lst : Collections.emptyList();
                }

                var7 = Collections.emptyList();
            } catch (Exception var11) {
                var11.printStackTrace();
                return lst != null && lst.size() != 0 ? lst : Collections.emptyList();
            } finally {
                if (jedis != null) {
                    jedis.close();
                }

            }

            return var7;
        }
    }

    /**
     * 插入，过期时间expire秒，如果value为空，就删除
     *
     */
    public static void setString(String key, String value, int expire) {
        if (HAS_REDIS && key != null && key.trim().length() != 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis != null) {
                try {
                    if (value == null) {
                        jedis.del(key);
                    } else {
                        jedis.set(key, value);
                        if (expire != 0) {
                            jedis.expire(key, expire);
                        }
                    }
                } catch (Exception var8) {
                    var8.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }
            }
        }

    }

    /**
     * 以秒为单位返回 key 的剩余过期时间
     *
     */
    public static Long ttl(String key) {
        if (!HAS_REDIS) {
            return null;
        } else if (key != null && key.trim().length() != 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis == null) {
                return null;
            } else {
                Long value = null;

                try {
                    value = jedis.ttl(key);
                } catch (Exception var7) {
                    var7.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }

                return value;
            }
        } else {
            return null;
        }
    }

    /**
     * 获取缓存
     *
     * @param key 键
     * @return 值
     */
    public static String getString(String key) {
        if (!HAS_REDIS) {
            return null;
        } else if (key != null && key.trim().length() != 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis == null) {
                return null;
            } else {
                String value = "";

                try {
                    value = jedis.get(key);
                } catch (Exception var7) {
                    var7.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }

                return value;
            }
        } else {
            return null;
        }
    }

    /**
     * 防止用户短时间内多次提交
     * Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在， SETEX 命令将会替换旧的值。
     * @param key
     * @return
     */
    public static String setex(String key,String value) {
        String result = "";
        Jedis jedis =RedisPool.getJedis();
        try {
            if (jedis.exists(key)) {
                result = jedis.setex(key,30,value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return result;
    }

    /**
     * 将一个或多个成员元素加入到集合中，已经存在于集合的成员元素将被忽略。
     * 假如集合 key 不存在，则创建一个只包含添加的元素作成员的集合。
     *
     */
    public static void addIntoSet(String key, String... values) {
        if (HAS_REDIS && key != null && key.trim().length() != 0 && values != null && values.length != 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis != null) {
                try {
                    jedis.sadd(key, values);
                } catch (Exception var7) {
                    var7.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }
            }
        }

    }

    /**
     * Redis Smembers 命令返回集合中的所有的成员。
     * 不存在的集合 key 被视为空集合。
     */
    public static Set<String> getSet(String key) {
        if (!HAS_REDIS) {
            return null;
        } else if (key != null && key.trim().length() != 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis == null) {
                return Collections.emptySet();
            } else {
                Object set = new HashSet();

                try {
                    set = jedis.smembers(key);
                } catch (Exception var7) {
                    var7.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }

                return (Set)set;
            }
        } else {
            return Collections.emptySet();
        }
    }

    /**
     * Lpush 命令将一个或多个值插入到列表头部。
     * 如果 key 不存在，一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时，返回一个错误。
     * @param 
     * @return long
     */
    public static long lpush(String key, String... values) {
        if (!HAS_REDIS) {
            return 0L;
        } else if (key != null && values != null) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis == null) {
                return 0L;
            } else {
                try {
                    long var3 = jedis.lpush(key, values);
                    long var5 = var3;
                    return var5;
                } catch (Exception var10) {
                    var10.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }

                return 0L;
            }
        } else {
            return 0L;
        }
    }

    /**
     * Rpop 命令用于移除列表的最后一个元素，返回值为移除的元素。
     * @param key
     * @return java.lang.String
     */
    public static String rpop(String key) {
        if (!HAS_REDIS) {
            return null;
        } else if (key == null) {
            return null;
        } else {
            Jedis jedis =RedisPool.getJedis();
            if (jedis == null) {
                return null;
            } else {
                try {
                    String var2 = jedis.rpop(key);
                    String var3 = var2;
                    return var3;
                } catch (Exception var7) {
                    var7.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }

                return null;
            }
        }
    }

    /**
     * 返回列表的长度。 如果列表 key 不存在，则 key 被解释为一个空列表，返回 0 。
     * 如果 key 不是列表类型，返回一个错误。
     * @param key
     * @return long
     */
    public static long llen(String key) {
        if (!HAS_REDIS) {
            return 0L;
        } else if (key == null) {
            return 0L;
        } else {
            Jedis jedis =RedisPool.getJedis();
            if (jedis == null) {
                return 0L;
            } else {
                try {
                    long var2 = jedis.llen(key);
                    long var4 = var2;
                    return var4;
                } catch (Exception var9) {
                    var9.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }

                return 0L;
            }
        }
    }

    /**
     * Scard 命令返回集合中元素的数量。
     * @param key
     * @return long
     */
    public static long scard(String key) {
        if (!HAS_REDIS) {
            return 0L;
        } else if (key == null) {
            return 0L;
        } else {
            Jedis jedis =RedisPool.getJedis();
            if (jedis == null) {
                return 0L;
            } else {
                try {
                    long var2 = jedis.scard(key);
                    long var4 = var2;
                    return var4;
                } catch (Exception var9) {
                    var9.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }

                return 0L;
            }
        }
    }

    /**
     * Keys 命令用于查找所有符合给定模式 pattern 的 key 。。
     * 例：KEYS z* 找所有z开头的key
     * @param pattern
     * @return java.util.Set<java.lang.String>
     */
    public static Set<String> keys(String pattern) {
        if (!HAS_REDIS) {
            return null;
        } else if (pattern != null && pattern.trim().length() != 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis == null) {
                return null;
            } else {
                Set ss = null;

                try {
                    ss = jedis.keys(pattern);
                } catch (Exception var7) {
                    var7.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }

                return ss;
            }
        } else {
            return null;
        }
    }

    /**
     * 设置 key 的过期时间，key 过期后将不再可用。单位以秒计。
     * @param key,seconds
     * @return void
     */
    public static void expire(String key, int seconds) {
        if (HAS_REDIS && key != null && key.trim().length() != 0 && seconds > 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis != null) {
                try {
                    jedis.expire(key, seconds);
                } catch (Exception var7) {
                    var7.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }
            }
        }

    }

    /**
     * 设置List集合, 过期时间 expireTimes 秒
     * @param key,list,expireTimes
     * @return void
     */
    public static void setList(String key, List<?> list, int expireTimes) {
        if (HAS_REDIS && key != null && key.trim().length() != 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis != null) {
                try {
                    String value = JsonUtil.toJSONString(list);
                    jedis.set(key, value);
                    if (expireTimes != 0) {
                        jedis.expire(key, expireTimes);
                    }
                } catch (Exception var8) {
                    var8.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }
            }
        }

    }

    /**
     * Hset 命令用于为哈希表中的字段赋值 。
     * 如果哈希表不存在，一个新的哈希表被创建并进行 HSET 操作。
     * 如果字段已经存在于哈希表中，旧值将被覆盖。
     * @param key,field,value,expireTimes
     * @return void
     */
    public static void hset(String key, String field, String value, int expireTimes) {
        if (HAS_REDIS && key != null && key.trim().length() != 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis != null) {
                try {
                    jedis.hset(key, field, value);
                    if (expireTimes != 0) {
                        jedis.expire(key, expireTimes);
                    }
                } catch (Exception var9) {
                    var9.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }
            }
        }

    }

    /**
     * Hget 命令用于返回哈希表中指定字段的值。
     * @param key,field
     * @return java.lang.String
     */
    public static String hget(String key, String field) {
        if (!HAS_REDIS) {
            return null;
        } else {
            String result = null;
            if (key != null && key.trim().length() != 0) {
                Jedis jedis =RedisPool.getJedis();
                if (jedis != null) {
                    try {
                        result = jedis.hget(key, field);
                    } catch (Exception var8) {
                        var8.printStackTrace();
                    } finally {
                        if (jedis != null) {
                            jedis.close();
                        }

                    }
                }

                return result;
            } else {
                return null;
            }
        }
    }

    /**
     * 删除已存在的键。不存在的 key 会被忽略。
     * @param key
     * @return void
     */
    public static void del(String key) {
        if (HAS_REDIS && key != null && key.trim().length() != 0) {
            Jedis jedis =RedisPool.getJedis();
            if (jedis != null) {
                try {
                    jedis.del(key);
                } catch (Exception var6) {
                    var6.printStackTrace();
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }

                }
            }
        }

    }
}
